package io.github.echarts.model.coordinate;

import io.github.echarts.model.coordinate.cartesian.DefaultCartesianCoordinateSystem;
import io.github.echarts.model.coordinate.polar.PolarCoordinateSystem;
import io.github.echarts.model.coordinate.radar.RadarCoordinateSystem;
import io.github.echarts.model.geometry.Rectangle;
import io.github.echarts.option.component.Grid;
import io.github.echarts.option.component.Radar;

import java.util.HashMap;
import java.util.Map;

/**
 * 坐标系工厂类
 * 负责创建和管理不同类型的坐标系实例，使坐标系的创建与使用分离
 */
public class CoordinateSystemFactory {
    
    /**
     * 根据类型和配置创建坐标系
     * 
     * @param type 坐标系类型
     * @param id 坐标系唯一标识
     * @param layoutArea 坐标系布局区域
     * @param config 坐标系配置对象
     * @return 创建的坐标系实例
     */
    public CoordinateSystem createCoordinateSystem(CoordinateSystemType type, String id, Rectangle layoutArea, Object config) {
        CoordinateSystem coordinateSystem = null;
        
        switch (type) {
            case CARTESIAN:
                coordinateSystem = createCartesianCoordinateSystem(id, layoutArea, (Grid) config);
                break;
            case POLAR:
                coordinateSystem = createPolarCoordinateSystem(id, layoutArea, config);
                break;
            case RADAR:
                coordinateSystem = createRadarCoordinateSystem(id, layoutArea, (Radar) config);
                break;
            default:
                throw new IllegalArgumentException("不支持的坐标系类型: " + type);
        }
        
        return coordinateSystem;
    }
    
    /**
     * 创建笛卡尔坐标系
     * 
     * @param id 坐标系ID
     * @param layoutArea 布局区域
     * @param grid 网格配置
     * @return 笛卡尔坐标系实例
     */
    private CoordinateSystem createCartesianCoordinateSystem(String id, Rectangle layoutArea, Grid grid) {
        // 创建笛卡尔坐标系实例
        return new DefaultCartesianCoordinateSystem(id, layoutArea);
    }
    
    /**
     * 创建极坐标系
     * 
     * @param id 坐标系ID
     * @param layoutArea 布局区域
     * @param config 配置对象
     * @return 极坐标系实例
     */
    private CoordinateSystem createPolarCoordinateSystem(String id, Rectangle layoutArea, Object config) {
        // 暂时返回笛卡尔坐标系作为替代，直到极坐标系实现完成
        return new DefaultCartesianCoordinateSystem(id, layoutArea);
    }
    
    /**
     * 创建雷达图坐标系
     * 
     * @param id 坐标系ID
     * @param layoutArea 布局区域
     * @param radar 雷达图配置
     * @return 雷达图坐标系实例
     */
    private CoordinateSystem createRadarCoordinateSystem(String id, Rectangle layoutArea, Radar radar) {
        // 暂时返回笛卡尔坐标系作为替代，直到雷达图坐标系实现完成
        return new DefaultCartesianCoordinateSystem(id, layoutArea);
    }
    
    /**
     * 创建坐标系并确保返回有效的实例，不会返回null
     * 
     * @param type 坐标系类型
     * @param id 坐标系唯一标识
     * @param layoutArea 坐标系布局区域
     * @param config 坐标系配置对象
     * @return 创建的坐标系实例，保证不为null
     */
    public CoordinateSystem ensureValidCoordinateSystem(CoordinateSystemType type, String id, Rectangle layoutArea, Object config) {
        CoordinateSystem system;
        try {
            system = createCoordinateSystem(type, id, layoutArea, config);
        } catch (Exception e) {
            // 如果创建过程出现异常，返回默认坐标系
            system = createDefaultCoordinateSystem(id, layoutArea);
        }
        
        if (system == null) {
            // 如果创建结果为空，返回默认坐标系
            system = createDefaultCoordinateSystem(id, layoutArea);
        }
        
        return system;
    }
    
    /**
     * 创建默认笛卡尔坐标系
     * 
     * @param id 坐标系ID
     * @param layoutArea 布局区域
     * @return 默认笛卡尔坐标系
     */
    public CoordinateSystem createDefaultCoordinateSystem(String id, Rectangle layoutArea) {
        return new DefaultCartesianCoordinateSystem(id, layoutArea);
    }
    
    /**
     * 为了向后兼容的方法，创建坐标系并自动生成ID
     * 
     * @param type 坐标系类型
     * @param layoutArea 坐标系布局区域
     * @param config 坐标系配置对象
     * @return 创建的坐标系实例
     * @deprecated 请使用带ID参数的方法代替
     */
    @Deprecated
    public CoordinateSystem createCoordinateSystem(CoordinateSystemType type, Rectangle layoutArea, Object config) {
        // 生成ID，格式为 type_timestamp
        String id = type.name().toLowerCase() + "_" + System.currentTimeMillis();
        return createCoordinateSystem(type, id, layoutArea, config);
    }
    
    /**
     * 为了向后兼容的方法，确保返回有效坐标系实例并自动生成ID
     * 
     * @param type 坐标系类型
     * @param layoutArea 坐标系布局区域
     * @param config 坐标系配置对象
     * @return 创建的坐标系实例，保证不为null
     * @deprecated 请使用带ID参数的方法代替
     */
    @Deprecated
    public CoordinateSystem ensureValidCoordinateSystem(CoordinateSystemType type, Rectangle layoutArea, Object config) {
        // 生成ID，格式为 type_timestamp
        String id = type.name().toLowerCase() + "_" + System.currentTimeMillis();
        return ensureValidCoordinateSystem(type, id, layoutArea, config);
    }
} 